#ifndef TYPEIMPORT_H
#define TYPEIMPORT_H

#include "datatypedefinition.h"

#include <QObject>
#include <QFile>

class QDomNode;
class QDomElement;
class QDomDocument;

class TypeImport : public QObject
{
    Q_OBJECT
public:
    explicit TypeImport(QObject *parent = nullptr);
    ~TypeImport();

    /**
     * @brief readDataTypeFile      读取文件
     * @param filePath              文件路径
     * @param datas                 数据类型数据
     * @return
     */
    bool readDataTypeFile(QFile &file,const QDomNode &root);

    /**
     * @brief dataProcess           数据处理
     * @param datas                 数据类型数据
     * @return
     */
    void typeMapping(/*QFile &file,*/DataTypeDefine::DataType &data);

    /**
     * @brief saveDataTypeFile      保存数据
     * @param filePath              文件路径
     * @param datas                 数据类型数据
     * @return
     */
    bool saveDataTypeFile(const QString &filePath, const DataTypeDefine::DataTypeList &datas);

    /**
     * @brief getTypeList_64        获取数据类型节点表
     * @param node                  默认模型文件或package根节点
     * @return
     */
    bool getTypeList_64(const QDomNode &node);

    bool saveTypeList_64(const QString & filePath,DataTypeDefine::DataTypeList &datas/*,QList<QDomNode> &typeList*/);

    static void clearDataTypeMap();


private:
    void typeListProcess_64(DataTypeDefine::DataType &type,QDomDocument &doc);

    /**
     * @brief parseTypes        解析数据类型
     * @param element           QDom元素
     */
    bool parseTypes(DataTypeDefine::DataType &type,const QDomElement &element);

    /**
     * @brief parseNormalData        解析共有数据
     * @param element                类型元素
     * @param typeName               数据类型名称
     * @param oid                    oid
     * @param comment                描述
     */
    void parseNormalData(DataTypeDefine::DataType &type,const QDomElement &element, const QString &typeName
                         , const QString &oid, const QString &comment);

    /**
     * @brief parseArrayData
     * @param element
     * @param typeName
     * @param oid
     * @param comment
     */
    void parseArrayData(DataTypeDefine::DataType &type,const QDomElement &element, const QString &typeName
                        , const QString &oid, const QString &comment);

    /**
     * @brief parseStructData
     * @param element
     * @param typeName
     * @param oid
     * @param comment
     */
    void parseStructData(DataTypeDefine::DataType &type,const QDomElement &element, const QString &typeName
                         , const QString &oid, const QString &comment);

    /**
     * @brief parseArrayTable
     * @param tableElement
     * @param arrayData
     */
    void parseArrayTable(const QDomElement &tableElement,DataTypeDefine::DimensionArray &arrayData);

    /**
     * @brief parseStructElementData
     * @param element
     * @param structId
     * @return
     */
    DataTypeDefine::StructEle parseStructElementData(const QDomElement &element, const QString &structId);

    /**
     * @brief saveTypes
     * @param element
     * @param data
     * @param doc
     */
    void saveTypes(QDomElement &element,const DataTypeDefine::DataType &data,QDomDocument &doc);

    /**
     * @brief saveNormalData
     * @param element
     * @param data
     * @param doc
     */
    void saveNormalData(QDomElement &element, const DataTypeDefine::DataType &data,QDomDocument &doc);

    /**
     * @brief saveArrayData
     * @param element
     * @param data
     * @param doc
     */
    void saveArrayData(QDomElement &element, const DataTypeDefine::DataType &data,QDomDocument &doc);

    /**
     * @brief saveArrayTable
     * @param table
     * @param arrayData
     * @param doc
     */
    void saveArrayTable(QDomElement &table, DataTypeDefine::DimensionArray arrayData, QDomDocument &doc);

    /**
     * @brief saveStructData
     * @param element
     * @param data
     * @param doc
     */
    void saveStructData(QDomElement &element, const DataTypeDefine::DataType &data,QDomDocument &doc);

    /**
     * @brief saveStructElementData
     * @param element
     * @param data
     * @param doc
     */
    void saveStructElementData(QDomElement &element, const DataTypeDefine::StructEle &data,QDomDocument &doc);

    /**
     * @brief getOid
     * @param defNode
     * @return
     */
    QString getOid(const QDomNode &defNode);

    /**
     * @brief getComment
     * @param idNode
     * @return
     */
    QString getComment(const QDomNode &idNode);

    /**
     * @brief typeConvert           数据类型转换
     * @param datas                 数据类型数据
     * @return
     */
    void typeConvert(/*QFile &file,*/const QHash<QString,QString> &hash, DataTypeDefine::DataType &data);

    /**
     * @brief typeConvert           oid转换
     * @param datas                 数据类型数据
     * @return
     */
    void oidConvert(DataTypeDefine::DataType &data);

public:
    DataTypeDefine::DataTypeList m_datas;
    QStringList deleteTypes;
    QStringList changeTypes;
    QStringList logList;//导入日志
    QHash<QString,QString> hash;

    //QList<QDomNode> typeList;
};

#endif // TYPEIMPORT_H
